From d1338d7326012d6ad1da73941cbe01660c04053a Mon Sep 17 00:00:00 2001 From: "iap10@tetris.cl.cam.ac.uk" Date: Thu, 25 Mar 2004 15:02:19 +0000 Subject: [PATCH] bitkeeper revision 1.825.1.7 (4062f47b6DnJOl2ZC6ptnk2jUPSAHA) add dom0 op for controlling shadow page tables --- xen/common/dom0_ops.c | 14 ++++++++++++++ xen/common/shadow.c | 22 ++++++++++++++++++++++ xen/include/hypervisor-ifs/dom0_ops.h | 17 +++++++++++++++++ xen/include/xen/shadow.h | 1 + 4 files changed, 54 insertions(+) diff --git a/xen/common/dom0_ops.c b/xen/common/dom0_ops.c index a5f7041f0b..01075e7560 100644 --- a/xen/common/dom0_ops.c +++ b/xen/common/dom0_ops.c @@ -18,6 +18,7 @@ #include #include #include +#include #include extern unsigned int alloc_new_dom_mem(struct task_struct *, unsigned int); @@ -485,6 +486,19 @@ long do_dom0_op(dom0_op_t *u_dom0_op) op->u.pcidev_access.enable); } break; + + case DOM0_SHADOW_CONTROL: + { + struct task_struct *p; + + p = find_domain_by_id( op->u.shadow_control.domain ); + if ( p ) + { + ret = shadow_mode_control(p, op->u.shadow_control.op ); + put_task_struct(p); + } + } + break; default: ret = -ENOSYS; diff --git a/xen/common/shadow.c b/xen/common/shadow.c index 29c7f9a8b9..37114fe892 100644 --- a/xen/common/shadow.c +++ b/xen/common/shadow.c @@ -26,6 +26,28 @@ hypercall lock anyhow (at least initially). ********/ +int shadow_mode_control( struct task_struct *p, unsigned int op ) +{ + if (p->mm.shadow_mode && op == DOM0_SHADOW_CONTROL_OP_OFF ) + { + shadow_mode_disable(p); + } + else if (p->mm.shadow_mode && op == DOM0_SHADOW_CONTROL_OP_ENABLE_TEST ) + { + shadow_mode_disable(p); + shadow_mode_enable(p, SHM_test); + } + else if (p->mm.shadow_mode && op == DOM0_SHADOW_CONTROL_OP_FLUSH ) + { + //shadow_mode_flush(p); + } + else + { + return -EINVAL; + } + + return 0; +} int shadow_mode_enable( struct task_struct *p, unsigned int mode ) { diff --git a/xen/include/hypervisor-ifs/dom0_ops.h b/xen/include/hypervisor-ifs/dom0_ops.h index 8574f02531..6e4b9b18c7 100644 --- a/xen/include/hypervisor-ifs/dom0_ops.h +++ b/xen/include/hypervisor-ifs/dom0_ops.h @@ -214,6 +214,22 @@ typedef struct dom0_pcidev_access_st int enable; } dom0_pcidev_access_t; +/* + * Control shadow pagetables operation + */ +#define DOM0_SHADOW_CONTROL 24 + +#define DOM0_SHADOW_CONTROL_OP_OFF 0 +#define DOM0_SHADOW_CONTROL_OP_ENABLE_TEST 1 +#define DOM0_SHADOW_CONTROL_OP_FLUSH 10 +typedef struct dom0_shadow_control_st +{ + /* IN variables. */ + domid_t domain; + int op; +} dom0_shadow_control_t; + + typedef struct dom0_op_st { unsigned long cmd; @@ -239,6 +255,7 @@ typedef struct dom0_op_st dom0_gettbufs_t gettbufs; dom0_physinfo_t physinfo; dom0_pcidev_access_t pcidev_access; + dom0_shadow_control_t shadow_control; } u; } dom0_op_t; diff --git a/xen/include/xen/shadow.h b/xen/include/xen/shadow.h index 3d3fa61166..2389fcae18 100644 --- a/xen/include/xen/shadow.h +++ b/xen/include/xen/shadow.h @@ -22,6 +22,7 @@ #define shadow_linear_pg_table ((l1_pgentry_t *)SH_LINEAR_PT_VIRT_START) #define shadow_linear_l2_table ((l2_pgentry_t *)(SH_LINEAR_PT_VIRT_START+(SH_LINEAR_PT_VIRT_START>>(L2_PAGETABLE_SHIFT-L1_PAGETABLE_SHIFT)))) +extern int shadow_mode_control( struct task_struct *p, unsigned int op ); extern pagetable_t shadow_mk_pagetable( struct task_struct *p, unsigned long gptbase); extern int shadow_fault( unsigned long va, long error_code ); -- 2.30.2